package BL;

import BE.BELogAudit;
import BE.BEMotivomovimiento;
import BE.BEPosicionxRack;
import BE.BERack;
import BE.BEUsuario;
import DA.DAAlmacen;
import DA.DARack;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.sql.rowset.Predicate;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
//import org.apache.commons.collections.CollectionUtils;

public class BLRack
{
    //MANTENIMIENTO
    private ArrayList<BERack> lstRacks;
    
    public BLRack()
    {
        lstRacks= new ArrayList<BERack>();
    }
    
    public void buscarRack (String nombre, int idZona, int idTipo, int idEstado,
                            JTable tblDatos, int tipoBusqueda)
    {
        DARack dARack = new DARack();
        ResultSet rs = null;

        BERack rack = new BERack();
        rack.setNombre(nombre);
        rack.setIdzona(idZona);
        rack.setIdTipo(idTipo);
        rack.setEstado(idEstado);
        
        rs = dARack.buscarRack(rack,tipoBusqueda);
        this.llenaTabla(rs, tblDatos);
    }

    public void llenaTabla (ResultSet rs, JTable tblDatos)
    {
        BLModelo modelo = new BLModelo();
        tblDatos.setModel(modelo);

        modelo.addColumn("IdRack");
        modelo.addColumn("Rack");
        modelo.addColumn("Zona");
        modelo.addColumn("Tipo Producto");
        modelo.addColumn("Filas");
        modelo.addColumn("Columnas");
        modelo.addColumn("Estado");
        //Ocultar columna ID
        tblDatos.getColumnModel().getColumn(0).setMaxWidth(0);
        tblDatos.getColumnModel().getColumn(0).setMinWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(0).setMaxWidth(0);
        tblDatos.getTableHeader().getColumnModel().getColumn(0).setMinWidth(0);

        try
        {
            while (rs.next())
            {
                Object [] fila = new Object[7];
                fila[0] = rs.getObject("IDRACK");
                fila[1] = rs.getObject(2);
                fila[2] = rs.getObject(3);
                fila[3] = rs.getObject(4);
                fila[4] = rs.getObject("NUMFILAS");
                fila[5] = rs.getObject("NUMCOLUMNAS");
                fila[6] = rs.getObject("ESTADO");

                if (fila[6].toString().equals("1"))
                    fila[6] = "ACTIVO";
                else
                    fila[6] = "INACTIVO";
                modelo.addRow(fila);
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,"Error al llenar la tabla",
                                          "Error",JOptionPane.ERROR_MESSAGE);
        }
    }

    public void limpiaTabla (JTable tblDatos)
    {
        DefaultTableModel modelo = new BLModelo();
        tblDatos.setModel(modelo);

        modelo.addColumn("Rack");
        modelo.addColumn("Zona");
        modelo.addColumn("Tipo Producto");
        modelo.addColumn("Filas");
        modelo.addColumn("Columnas");
        modelo.addColumn("Estado");
    }

    //int idRack, String nombre, int idZona, String numFila, String numColumna,String x, String y, int tipo
    public  void agregaRackCargaMasiva(BERack beRack)
    {
        DARack daRack = new DARack();
        
        int posicionesY[] = new int[beRack.getNumeroColumnas()];
        for (int i=0;i<posicionesY.length;i++)
            posicionesY[i] = beRack.getPosicion().getColumna() + i;

        daRack.agregarRackCargaMasiva(beRack,posicionesY);

        for(int i=1;i<=beRack.getNumeroFilas();i++)
        {
            for(int j=1;j<=beRack.getNumeroColumnas();j++)
            {
                daRack.agregarPosicionRack(beRack.getIdRack(),beRack.getIdzona(), i, j);
            }
        }
    }
    
    //AGREGAR
    public  int agregaRack(String nombre, int idZona, String numFila, String numColumna,
                           String x, String y, int tipo)
    {
        BERack beRack = new BERack();
        DARack daRack = new DARack();
        DAAlmacen daAlmacen = new DAAlmacen();
        BLValidaciones validar = new BLValidaciones();
        
        int ancho = daAlmacen.getAnchobyId();
        int largo = daAlmacen.getLargobyId();

        if (nombre.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir un nombre para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (numColumna.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una cantidad de columnas para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (numFila.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una cantidad de filas para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (x.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una posición X para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (y.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una posición Y para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (idZona == 0)
            JOptionPane.showMessageDialog(null,"Debe elegir una zona para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (daRack.existeNombre(validar.validarSqlInjection(nombre)))
            JOptionPane.showMessageDialog(null,"El nombre del rack ya existe",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (x.equals("1") || x.equals(ancho +""))
            JOptionPane.showMessageDialog(null,"La posición X no es válida",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (y.equals("1") || y.equals(largo +""))
            JOptionPane.showMessageDialog(null,"La posición Y no es válida",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else
            if (JOptionPane.showConfirmDialog(null,"¿Desea agregar el rack?",
                "Confirmación",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
            {
                beRack.setIdzona(idZona);
                beRack.setNombre(validar.validarSqlInjection(nombre));
                beRack.setNumeroColumnas(Integer.parseInt(numColumna +""));
                beRack.setNumeroFilas(Integer.parseInt(numFila +""));
                beRack.getPosicion().setFila(Integer.parseInt(x));
                beRack.getPosicion().setColumna(Integer.parseInt(y));

                int posicionesY[] = new int[beRack.getNumeroColumnas()];
                for (int i=0;i<posicionesY.length;i++)
                    posicionesY[i] = beRack.getPosicion().getColumna() + i;


                int resultado= daRack.agregarRack(beRack,posicionesY,tipo);
                
                if(resultado==1) return 1;
                else if (tipo == 0)
                {
                    int idRack= daRack.obtenerIdMaximo();
                    for(int i=1;i<=Integer.parseInt(numFila);i++)
                    {
                        for(int j=1;j<=Integer.parseInt(numColumna);j++)
                        {
                            //System.out.println("Agregando en el Rack: "+idRack+", en la fila :"+i+", columna: "+j );
                            daRack.agregarPosicionRack(idRack,idZona, i, j);
                        }
                    }
                    return 0;
                }
                else if (resultado == 0) return 0;
            }

        return 1;
    }

    //ELIMINAR
    public void eliminarRack (JTable tblDatos,BEUsuario objUsuario)
    {
        int retorno = 1;
        int fila;
        int columna = 0;
        int idProd=0;
        DARack daRack = new DARack();

        fila = tblDatos.getSelectedRow();

        if (fila < 0)
            JOptionPane.showMessageDialog(null,"Debe seleccionar un rack para eliminar",
                                          "Información",JOptionPane.INFORMATION_MESSAGE);
        else if (tblDatos.getModel().getValueAt(fila,6).toString().equals("INACTIVO"))
            JOptionPane.showMessageDialog(null,"El rack ya se encuentra INACTIVO",
                                          "Error",JOptionPane.ERROR_MESSAGE);
        else if (JOptionPane.showConfirmDialog(null,"¿Desea eliminar el rack?",
                 "Confirmacion",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
        {
            idProd = Integer.parseInt(tblDatos.getModel().getValueAt(fila,columna).toString());
            retorno = daRack.eliminarRack(idProd,0);
        }

        if (retorno == 0)
        {
            
            BLRack objGestorRack = new BLRack();
            BERack objRack = objGestorRack.buscarRackPorId(idProd);
            
            BLLogAudit objgestorAdit = new BLLogAudit();
            BELogAudit objlogAudit= new BELogAudit();
            
            objlogAudit.setIdUsuario(objUsuario.getIdUsuario());
            objlogAudit.setIdInterface(0);
            objlogAudit.setIdUsuario(objUsuario.getIdUsuario());
            objlogAudit.setAccion("Eliminacion del Rack "+objRack.getNombre()+" por el usuario "+objUsuario.getUsuario()+"." );
            Date aux= new Date();
            Timestamp fecha= new Timestamp(aux.getTime());
            
            objlogAudit.setFecha(fecha);
            
            objgestorAdit.registrarAccion(objlogAudit);
            
            
            
            
            
            
            
            JOptionPane.showMessageDialog(null,"Se eliminó el rack",
                                          "Información",JOptionPane.INFORMATION_MESSAGE);
            this.limpiaTabla(tblDatos);
            this.buscarRack("",0,0,0,tblDatos,0);
        }
    }

    public BERack getRackbyId(int idRack)
    {
        DARack daRack = new DARack();
        BERack rack = daRack.getProdbyId(idRack);

        return rack;
    }

    public int modificaRack(BERack beRack,String x, String y)
    
    {
       int retorno = 1;
        DARack daRack= new DARack();
        DAAlmacen daAlmacen = new DAAlmacen();
        
        int ancho = daAlmacen.getAnchobyId();
        int largo = daAlmacen.getLargobyId();
        
        if (x.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una posición X",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (y.equals(""))
            JOptionPane.showMessageDialog(null,"Debe elegir una posición Y",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (beRack.getIdzona() == 0)
            JOptionPane.showMessageDialog(null,"Debe elegir una zona para el rack",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (x.equals("1") || x.equals(ancho +""))
            JOptionPane.showMessageDialog(null,"La posición X no es válida",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else if (y.equals("1") || y.equals(largo +""))
            JOptionPane.showMessageDialog(null,"La posición Y no es válida",
                                               "Error",JOptionPane.ERROR_MESSAGE);
        else
            if (JOptionPane.showConfirmDialog(null,"¿Desea editar el rack?",
                "Confirmación",JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE) == 0)
            {          

                    beRack.getPosicion().setFila(Integer.parseInt(x));
                    beRack.getPosicion().setColumna(Integer.parseInt(y));
                    
                    if (daRack.eliminarRack(beRack.getIdRack(),1) == 0)
                        //return daRack.agregarRack(beRack, posicionesY);
                        retorno = daRack.modificaRack(beRack);
            }

        return retorno;
    }
    
    public boolean cabeRack (int x, int [] posicion)
    {
        //agregamos el paso libre
        int pos[] = new int[posicion.length+1];
        int i;
        for (i=0;i<posicion.length;i++)
            pos[i] = posicion[i];
        pos[i] = posicion[i-1] + 1;
        
        DARack daRack = new DARack();
        for (i=0;i<pos.length;i++)
            if (!daRack.cabeRack(x,pos[i]))
                return false;
        return true;
    }
    
    public void cargar()
    {
        DARack dARack = new DARack();
        setLstRacks(dARack.obtenerRacks());
        
        
    }

    public ArrayList<BERack> getLstRacks() {
        return lstRacks;
    }

    public void setLstRacks(ArrayList<BERack> lstRacks) {
        this.lstRacks = lstRacks;
    }
    
    public BERack getRackfromLst (int id){
        for (int i=0; i<this.lstRacks.size(); i++){
            if (this.lstRacks.get(i).getIdRack()==id)
                return this.lstRacks.get(i);
        }
        return null;
    }

    public BERack llenaVentana(int id) {
         DARack darack = new DARack();
        BERack contacto = darack.getProdbyId(id);

        return contacto;
    }

         public List<BEPosicionxRack> getPosicionesLibres(int idRack){
             DARack darack = new DARack();
             return darack.getPosicionesLibres(idRack);
         }
    public void llenarCombo(JComboBox cmbRack,int idRack){
         BLRack blrack = new BLRack();
        List<BEPosicionxRack> tipos = new ArrayList<BEPosicionxRack>();

        tipos = blrack.getPosicionesLibres(idRack);


            //cmbRack.addItem(new BLCombo(0,"TODOS"));

        if (tipos != null)
            for (int i=0;i<tipos.size();i++)
                cmbRack.addItem(new BLCombo(tipos.get(i).getIdposicionxrack(),
                                     tipos.get(i).getFila(),tipos.get(i).getColumna()));

    }

    void cargarIdProd(int IdTipoProd) {
        DARack dARack = new DARack();
        setLstRacks(dARack.obtenerRacks(IdTipoProd));
    }

    BERack buscarRackPorId(int idrack) {
     
        
        for (BERack rack:lstRacks)
        {
            if (rack.getIdRack()==idrack) return rack;
        }
        
        return null;
    }

  
}
